﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Csharpzuoye
{   //属性作业
    //3.一起帮的求助可以有多个（最多10个）关键字，请为其设置索引器，以便于我们通过其整数下标进行读写。 
    //4.设计一种方式，保证：
    //1)每一个Problem对象一定有Body赋值
    //2)每一个User对象一定有Name和Password赋值

    //静态作业
    //2.考虑求助（Problem）的以下方法/属性，哪些适合实例，哪些适合静态，然后添加到类中：
    //1.）Publish()：发布一篇求助，并将其保存到数据库
    //2.）Load(int Id)：根据Id从数据库获取一条求助
    //3.）Delete(int Id)：根据Id删除某个求助
    //4.）repoistory：可用于在底层实现上述方法和数据库的连接操作等   属性还是字段

    //Linq
    //为求助（Problem）添加悬赏（Reward）属性，并找出每一篇求助的悬赏都大于5个帮帮币的求助作者 

    //异常
    //修改之前的属性验证：problem.Reward为负数时直接抛出“参数越界”异常 
    public class Problem : Content//发布问题：标题（headline）、正文说明（body）、关键字（keyword）、悬赏（reward）
    {
        private string _headline;
        private string _body;
        private int reward;
        //private keyword[];
        private string[] keywords;
        public ProblemStatus Status { get; set; }
        public int EFReward { get; set; }
        public DateTime Publishtime { get; set; }

        public User User { get; set; }
        
        //3.）problem.Reward不能为负数 
        public int Reward
        {
            set
            {
                if (value < 0)
                {
                    throw new ArgumentOutOfRangeException("帮帮币的数量不能为负数");
                    //Console.WriteLine("你太抠了吧！");
                    //return;
                }
                reward = value;
            }
            get { return reward; }
        }
        //3.一起帮的求助可以有多个（最多10个）关键字，请为其设置索引器，以便于我们通过其整数下标进行读写。
        public Problem(int length)
        {
            keywords = new string[length];
        }
        public string this[int index]
        {
            //int index = Convert.ToInt32
            set { keywords[index] = value; }
            get { return keywords[index]; }
        }
        //4.设计一种方式，保证：
        // 每一个Problem对象一定有Body赋值
        //每一个User对象一定有Name和Password赋值
        public Problem(string body)
        {
            _body = body;
        }

        //2.考虑求助（Problem）的以下方法/属性，哪些适合实例，哪些适合静态，然后添加到类中：
        //1.）Publish()：发布一篇求助，并将其保存到数据库
        //2.）Load(int Id)：根据Id从数据库获取一条求助
        //3.）Delete(int Id)：根据Id删除某个求助
        //4.）repoistory：可用于在底层实现上述方法和数据库的连接操作等   属性还是字段

        //HelpMoneyChangedAttribute(int mount,Properties:[Message = string])
        [HelpMoneyChanged(3, Message = "需要消耗的帮帮币数量")]
        public override void Publish()
        {
            reward--;
        }
        public string Load(int Id)
        {
            Id++;
            return "根据{Id}从数据库获取一条求助";
        }
        public string Delete(int Id)
        {
            Id--;
            return "根据{Id}删除某个求助";
        }

        public Problem() : base(" ")
        {

        }
        
        public enum ProblemStatus
        {
            Rewarded,
            Repealed,
            assisting,
        }

    }
}
